package pe.com.cotelasa.scp.dominio.servicio.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOParametro;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.entidad.Parametro;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;

@Service
public class ServicioParametroImpl implements IServicioParametro, Serializable {

    private static final long serialVersionUID = 2813626886531445162L;
    @Inject
    private IDAOParametro daoParametro;

    @Override
    public Collection<ParametroDetalle> listarTiposProveedoresActivos()
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("nombreParametro", "TIPO_ENTIDAD");
        List<Parametro> coleccionParametro = null;
        try {
            coleccionParametro = (List<Parametro>) daoParametro.obtenerColeccionEntidadPorFiltros(Parametro.class, parametros);
            if (coleccionParametro.size() >= 1) {
                Parametro param = daoParametro.obtenerEntidadPorId(Parametro.class, coleccionParametro.get(0).getId());
                Collection<ParametroDetalle> detalles = new ArrayList<ParametroDetalle>();
                detalles.addAll(param.getParametroDetalleCollection());

                return detalles;
            } else {
                throw new ServiceException("No se encontraron valores", null);
            }
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        } catch (Exception ex) {
            throw new ServiceException("No se encontraron valores", ex);
        }
    }

    @Override
    public Collection<ParametroDetalle> listarTipoCuentaBancariaActivas()
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("nombreParametro", "TIPO_CUENTA_BANCARIA");
        parametros.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
        List<Parametro> coleccionParametro = null;
        try {
            coleccionParametro = (List<Parametro>) daoParametro.obtenerColeccionEntidadPorFiltros(Parametro.class, parametros);
            if (coleccionParametro.size() >= 1) {
                Parametro param = daoParametro.obtenerEntidadPorId(Parametro.class, coleccionParametro.get(0).getId());
                Collection<ParametroDetalle> detalles = new ArrayList<ParametroDetalle>();
                detalles.addAll(param.getParametroDetalleCollection());

                return detalles;
            } else {
                throw new ServiceException("No se encontraron valores", null);
            }
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        } catch (Exception ex) {
            throw new ServiceException("No se encontraron valores", ex);
        }
    }

    @Override
    public Collection<ParametroDetalle> listarTipoArticuloActivos()
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("nombreParametro", "TIPO_ARTICULO");
        parametros.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
        List<Parametro> coleccionParametro = null;
        try {
            coleccionParametro = (List<Parametro>) daoParametro.obtenerColeccionEntidadPorFiltros(Parametro.class, parametros);
            if (coleccionParametro.size() >= 1) {
                Parametro param = daoParametro.obtenerEntidadPorId(Parametro.class, coleccionParametro.get(0).getId());
                Collection<ParametroDetalle> detalles = new ArrayList<ParametroDetalle>();
                detalles.addAll(param.getParametroDetalleCollection());

                return detalles;
            } else {
                throw new ServiceException("No se encontraron valores", null);
            }
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        } catch (Exception ex) {
            throw new ServiceException("No se encontraron valores", ex);
        }
    }

    @Override
    public Collection<ParametroDetalle> listarTipoCategoriaActivos()
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("nombreParametro", "TIPO_CATEGORIA");
        parametros.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
        List<Parametro> coleccionParametro = null;
        try {
            coleccionParametro = (List<Parametro>) daoParametro.obtenerColeccionEntidadPorFiltros(Parametro.class, parametros);
            if (coleccionParametro.size() >= 1) {
                Parametro param = daoParametro.obtenerEntidadPorId(Parametro.class, coleccionParametro.get(0).getId());
                Collection<ParametroDetalle> detalles = new ArrayList<ParametroDetalle>();
                detalles.addAll(param.getParametroDetalleCollection());

                return detalles;
            } else {
                throw new ServiceException("No se encontraron valores", null);
            }
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        } catch (Exception ex) {
            throw new ServiceException("No se encontraron valores", ex);
        }
    }

    @Override
    public Collection<ParametroDetalle> listarTipoMaterialActivos()
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("nombreParametro", "TIPO_MATERIAL");
        parametros.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
        List<Parametro> coleccionParametro = null;
        try {
            coleccionParametro = (List<Parametro>) daoParametro.obtenerColeccionEntidadPorFiltros(Parametro.class, parametros);
            if (coleccionParametro.size() >= 1) {
                Parametro param = daoParametro.obtenerEntidadPorId(Parametro.class, coleccionParametro.get(0).getId());
                Collection<ParametroDetalle> detalles = new ArrayList<ParametroDetalle>();
                detalles.addAll(param.getParametroDetalleCollection());

                return detalles;
            } else {
                throw new ServiceException("No se encontraron valores", null);
            }
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        } catch (Exception ex) {
            throw new ServiceException("No se encontraron valores", ex);
        }
    }

    public Collection<ParametroDetalle> listarTipoGuiasActivas()
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("nombreParametro", "TIPO_GUIA");
        parametros.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
        List<Parametro> coleccionParametro = null;
        try {
            coleccionParametro = (List<Parametro>) daoParametro.obtenerColeccionEntidadPorFiltros(Parametro.class, parametros);
            if (coleccionParametro.size() >= 1) {
                Parametro param = daoParametro.obtenerEntidadPorId(Parametro.class, coleccionParametro.get(0).getId());
                Collection<ParametroDetalle> detalles = new ArrayList<ParametroDetalle>();
                detalles.addAll(param.getParametroDetalleCollection());

                return detalles;
            } else {
                throw new ServiceException("No se encontraron valores", null);
            }
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        } catch (Exception ex) {
            throw new ServiceException("No se encontraron valores", ex);
        }
    }

    public Collection<ParametroDetalle> listarTipoProveedorActivos()
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("nombreParametro", "TIPO_PROVEEDOR");
        parametros.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
        List<Parametro> coleccionParametro = null;
        try {
            coleccionParametro = (List<Parametro>) daoParametro.obtenerColeccionEntidadPorFiltros(Parametro.class, parametros);
            if (coleccionParametro.size() >= 1) {
                Parametro param = daoParametro.obtenerEntidadPorId(Parametro.class, coleccionParametro.get(0).getId());
                Collection<ParametroDetalle> detalles = new ArrayList<ParametroDetalle>();
                detalles.addAll(param.getParametroDetalleCollection());

                return detalles;
            } else {
                throw new ServiceException("No se encontraron valores", null);
            }
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        } catch (Exception ex) {
            throw new ServiceException("No se encontraron valores", ex);
        }
    }

    public Collection<ParametroDetalle> listarTipoOrdenActivos()
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("nombreParametro", "TIPO_ORDEN");
        parametros.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
        List<Parametro> coleccionParametro = null;
        try {
            coleccionParametro = (List<Parametro>) daoParametro.obtenerColeccionEntidadPorFiltros(Parametro.class, parametros);
            if (coleccionParametro.size() >= 1) {
                Parametro param = daoParametro.obtenerEntidadPorId(Parametro.class, coleccionParametro.get(0).getId());
                Collection<ParametroDetalle> detalles = new ArrayList<ParametroDetalle>();
                detalles.addAll(param.getParametroDetalleCollection());

                return detalles;
            } else {
                throw new ServiceException("No se encontraron valores", null);
            }
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        } catch (Exception ex) {
            throw new ServiceException("No se encontraron valores", ex);
        }
    }

    @Override
    public Collection<ParametroDetalle> listaTipoMotivoGuia()
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("nombreParametro", "MOTIVO_GUIA_REMISION");
        parametros.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
        List<Parametro> coleccionParametro = null;
        try {
            coleccionParametro = (List<Parametro>) daoParametro.obtenerColeccionEntidadPorFiltros(Parametro.class, parametros);
            if (coleccionParametro.size() >= 1) {
                Parametro param = daoParametro.obtenerEntidadPorId(Parametro.class, coleccionParametro.get(0).getId());
                Collection<ParametroDetalle> detalles = new ArrayList<ParametroDetalle>();
                detalles.addAll(param.getParametroDetalleCollection());

                return detalles;
            } else {
                throw new ServiceException("No se encontraron valores", null);
            }
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        } catch (Exception ex) {
            throw new ServiceException("No se encontraron valores", ex);
        }
    }

    @Override
    public Collection<ParametroDetalle> listaTipoEstadoCajaChica()
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("nombreParametro", "ESTADO_CAJA_CHICA");
        parametros.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
        return obtenerLista(parametros);
    }

    private Collection<ParametroDetalle> obtenerLista(Map<String, Object> parametros) throws ServiceException {
        List<Parametro> coleccionParametro = null;
        try {
            coleccionParametro = (List<Parametro>) daoParametro.obtenerColeccionEntidadPorFiltros(Parametro.class, parametros);
            if (coleccionParametro.size() >= 1) {
                Parametro param = daoParametro.obtenerEntidadPorId(Parametro.class, coleccionParametro.get(0).getId());
                Collection<ParametroDetalle> detalles = new ArrayList<ParametroDetalle>();
                detalles.addAll(param.getParametroDetalleCollection());

                return detalles;
            } else {
                throw new ServiceException("No se encontraron valores", null);
            }
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        } catch (Exception ex) {
            throw new ServiceException("No se encontraron valores", ex);
        }
    }

    @Override
    public Collection<ParametroDetalle> listarTipoMovimiento()
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("id", Constantes.ParametroDetalle.PARAMETRO_DETALLE_TIPO_MOVIMIENTO);
        parametros.put("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor());
        return obtenerLista(parametros);
    }

    @Override
    public Collection<ParametroDetalle> listarFormaMovimiento()
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("id", Constantes.ParametroDetalle.PARAMETRO_DETALLE_FORMA_MOVIMIENTO);
        parametros.put("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor());
        return obtenerLista(parametros);
    }

    @Override
    public Collection<ParametroDetalle> listaTipoMotivoNotaCredito() throws ServiceException {

        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("nombreParametro", "MOTIVO_NOTA_CREDITO");
        parametros.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
        List<Parametro> coleccionParametro = null;
        try {
            coleccionParametro = (List<Parametro>) daoParametro.obtenerColeccionEntidadPorFiltros(Parametro.class, parametros);
            if (coleccionParametro.size() >= 1) {
                Parametro param = daoParametro.obtenerEntidadPorId(Parametro.class, coleccionParametro.get(0).getId());
                Collection<ParametroDetalle> detalles = new ArrayList<ParametroDetalle>();
                detalles.addAll(param.getParametroDetalleCollection());

                return detalles;
            } else {
                throw new ServiceException("No se encontraron valores", null);
            }
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        } catch (Exception ex) {
            throw new ServiceException("No se encontraron valores", ex);
        }
    }

    @Override
    public Collection<ParametroDetalle> listarTipoPago(String parametro)
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("nombreParametro", "FORMA_"+parametro);
        parametros.put("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor());
        return obtenerLista(parametros);
    }
}
